// 获取用户收货地址
// 页面加载完毕 -> 获取本地存储中的地址 -> 将数据存储到data当中
// 点击显示页面 调用onShow 回到商品详情页，手动添加商品的选中状态为true
// 全选的实现 -- 在onShow获取购物车的数组 遍历购物车的商品数据 所有的商品checked为true 则为true
// 总价格和总数量 遍历购物车数组，判断商品是否被选中 总价格+=商品单价 * 数量 总数量 += 商品的数量
// 商品的选中功能 绑定change事件 获取到被修改的商品对象 商品对象的选中状态取反 将data中和缓存中的数据修改 总价格和总数量修改
// 全选和反选功能 全选复选框绑定事件 获取data的全选变量 直接取反 遍历购物车数组，让里面的选中状态和allChecked关联 将购物车数组和allChecked重新赋值给data和缓存
// 商品数量的编辑功能 + - 绑定点击事件 区分的关键在于自定义属性身上 传递被点击的商品的id 获取data中的购物车数组 获取需要被修改的商品对象 直接修改num 将购物车数组和allChecked重新赋值给data和缓存
// 当购物车的商品数量=1 用户点击- 询问是否删除
// 点击结算 判断是否有收获地址信息 判断用户是否选购商品 跳转到支付页面
import { getSetting, chooseAddress, openSetting, showModal, showToast } from "../../utils/asyncWx.js"
Page({
  data: {
    address: {},
    cart: [],
    allChecked: false,
    totalPrice: 0,
    totalNum: 0
  },
  onShow() {
    // 获取缓存中的收货地址信息
    const address = wx.getStorageSync("address")
    // 获取缓存中的购物车数据
    const cart = wx.getStorageSync("cart") || []
    this.setData({
      address
    })
    this.setCart(cart)
  },

  // 点击收货地址
  async handleChooseAddress() {
    // 因为没有处理promise的err结果，控制台会报错，抛出异常就可以了
    try {
      const res1 = await getSetting()
      console.log(res1)
      const scopeAddress = res1.authSetting["scope.address"]
      console.log(scopeAddress)
      // 判断权限状态
      if (scopeAddress === false) {
        // 诱导用户打来权限
        await openSetting()
      }
      // 调用获取收货地址的api
      const res2 = await chooseAddress()
      // 将地址存入缓存当中
      wx.setStorageSync("address", res2);
    } catch (error) {
      console.log(error)
    }
  },

  // 商品的选中
  handItemChange(e) {
    const { id } = e.currentTarget.dataset
    console.log(id)
    // 获取购物车数据
    let { cart } = this.data
    // 找到被修改的商品对象
    let index = cart.findIndex(v => v.goods_id === id)
    // 将复选框取反
    cart[index].checked = !cart[index].checked
    this.setCart(cart)
  },

  // 设置购物车状态，重新计算底部工具栏的数据，更新页面数据和缓存信息
  setCart(cart) {
    let allChecked = true
    // 重新计算价格和数量
    let totalPrice = 0
    let totalNum = 0
    cart.forEach(v => {
      if (v.checked) {
        totalPrice += v.num * v.goods_price
        totalNum += v.num
      } else {
        allChecked = false
      }
    })
    // 空数组不会调用forEach方法，所以allChecked会直接为true，此处应该判断一下数组的长度
    allChecked = cart.length != 0 ? allChecked : false
    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    })
    // 把data数据还有缓存数据更新
    wx.setStorageSync("cart", cart);
  },

  // 全选和反选
  handItemAllChange() {
    let {cart, allChecked} = this.data
    allChecked = !allChecked
    cart.forEach(v => v.checked = allChecked)
    this.setCart(cart)
  },

  // 商品数量
  async handleItemNumEdit(e) {
    const { operation, id } = e.currentTarget.dataset
    let cart = this.data.cart
    const index = cart.findIndex(v => v.goods_id === id)
    if (cart[index].num ===1 && operation === -1) {
      const res = await showModal({
        content: "您是否要删除？"
      })
      if (res.confirm) {
        cart.splice(index, 1)
        this.setCart(cart)
      }
    } else {
      cart[index].num += operation
      this.setCart(cart)
    }
  },

  // 点击结算功能
  async handlePay() {
    const { address, totalNum } = this.data
    // 判断收获地址
    if (!address.userName) {
      await showToast({title: "您还没有选择收获地址"})
      return
    }
    // 判断是否有选中商品
    if (totalNum ===0) {
      await showToast({title: "您还没有选中商品"})
      return
    }
    // 跳转到支付页面
    wx.navigateTo({
      url: "/pages/pay/index"
    })
  }
})